package com.sth.shishan;

/**
 * @Author: sitianhong
 * @Description: 基于令牌的用户登录会话机制  hash
 * @Since: create in 2021/6/13 0013 17:21
 */

import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 用户平时访问我们系统的时候,在处理任何请求的时候,必须检查一下,这个请求是否带上了一个令牌,如果带了
 * 一个令牌,那么必须去redis里面检查一下,这个令牌是否有在redis里面,合法,有效的一个session 会话,
 * <p>
 * 如果有这个session会话,此时就允许这个请求被处理,因为说明这个人之前已经登录过我们系统了,登录过后才会在reids
 * 里面放一个有效的session会话,如果说没有这个session的话,此时用户就会强制下线
 * <p>
 * 如果用户登录通过之后,就会给浏览器or客户端一块令牌,同时在redis里面初始化好一个session会话,后续客户端就会在
 * 指定的时间范围内发送请求的时候带上一块令牌
 * <p>
 * hset把用户的id和令牌存储一下, hset 把用户的id和过期时间存储一下
 * 过一段时间后session会话会过期,虽然带上了令牌,但是过期了也不行
 */
public class RedisDemo4 {
    Jedis jedis = new Jedis("127.0.0.1", 6378);

    @Test // 实现 社交网站点击追踪机制1
    public void demo1() throws ParseException {
        initSession("sith", "ddd");
        boolean ddd = isSessionValid("ddd");

        System.out.println("会话是否有效 " + ddd);
    }

    // 校验是否有效
    public boolean isSessionValid(String token) throws ParseException {
        if (token == null || token.equals("")) {
            return false;
        }
        // 这里拿到的session 是一个字符串, 这里放入用户的uid
        String session = jedis.hget("session", "session::" + token);
        if (session == null) {
            return false;
        }
        // 检查session是否在有效期内
        String expireTime = jedis.hget("session::expire_time", "session::" + token);
        if (null == expireTime || expireTime.equals("")) {
            return false;
        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date expireTimeDate = dateFormat.parse(expireTime);
        Date now = new Date();
        if (now.after(expireTimeDate)) {
            return false;
        }
        // 不为空,且有效
        return true;
    }

    // 初始化 session
    public void initSession(String userId, String token) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.HOUR, 24);
        Date expireTime = calendar.getTime();
        jedis.hset("session", "session::" + token, String.valueOf(userId));
        jedis.hset("session::expire_time", "session::" + token, dateFormat.format(expireTime));
    }
}
